/**
 * 封装不同类型的restful请求
 */
import Request from 'luch-request';
import { getBaseUrl } from '@/utils/env';
import router from '@/router';
import { Toast } from '@/utils/uniapi/prompt';
import { checkStatus } from '@/utils/http/checkStatus';
import {useAuthStore} from '@/store';

const BASE_URL = getBaseUrl();

const HEADER = {
	'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
};

const http = new Request({
	// 全局配置
	baseURL: BASE_URL,
	header: HEADER,
	method: 'GET',
	dataType: 'json',
	// #ifndef MP-ALIPAY
	responseType: 'text',
	// #endif
	// 注：如果局部custom与全局custom有同名属性，则后面的属性会覆盖前面的属性，相当于Object.assign(全局，局部)
	custom: {}, // 全局自定义参数默认值
	// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
	timeout: 60000,
	// #endif
	// #ifdef APP-PLUS
	sslVerify: true,
	// #endif
	// #ifdef H5
	// 跨域请求时是否携带凭证（cookies）仅H5支持（HBuilderX 2.6.15+）
	withCredentials: false,
	// #endif
	// #ifdef APP-PLUS
	firstIpv4: ture, // DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
	// #endif
	// 局部优先级高于全局，返回当前请求的task,options。请勿在此处修改options。非必填
	// getTask: (task, options) => {
	// 相当于设置了请求超时时间500ms
	//   setTimeout(() => {
	//     task.abort()
	//   }, 500)
	// },
	// 全局自定义验证器。参数为statusCode 且必存在，不用判断空情况。
	// validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置
	// 	return statusCode >= 200 && statusCode < 300
	// }
});

//请求拦截器
http.interceptors.request.use((config) => { // 可使用async await 做异步操作
	const authStore = useAuthStore();

	const token = authStore.getToken;
	// if(token) config.header.token = token

	if (config.custom.auth) {
		// 需要权限认证的路由 需携带自定义参数 {custom: {auth: true}}
		if(!token) {
			router.push({ name: 'Login' });
		}
		config.header.token = token;
	}

	if (config.custom.loading) {
   	uni.showLoading()
  }

	return config
}, error => {
	return Promise.resolve(error)
})
 
// 响应拦截器
http.interceptors.response.use((response) => {
	console.log(response)
	
	const { statusCode, data: rawData } = response;
	const { code, msg, data } = rawData;
	
	if (statusCode === 200) {
		if (code === 1) {
			return data;
		}
		msg && Toast(msg);
		return Promise.reject(rawData);
	}
	checkStatus(statusCode, msg || '');
	// if (statusCode === 401) {
	// 	router.push({ name: 'Login' });
	// }
	return Promise.reject(rawData);
}, (error) => {
	console.log(error)
	const { statusCode, rawData } = error;
	const { msg } = rawData;
	checkStatus(statusCode, msg || '');
	//未登录时清空缓存跳转
	if (statusCode == 401) {
		setTimeout(function () {
			router.push({ name: 'Login' });
		}, 2000);
	}
	return Promise.resolve(error)
})

export const request = http;